Doh! Mixed up x and y.
author7 <alexl@redhat.com>
Wed, 17 Jan 2001 15:52:22 +0000 (15:52 +0000)
committerAlexander Larsson <alexl@src.gnome.org>
Wed, 17 Jan 2001 15:52:22 +0000 (15:52 +0000)
2001-01-17    <alexl@redhat.com>

* gdk/linux-fb/gdkdrawable-fb2.c (gdk_shadow_fb_draw_arc):
Doh! Mixed up x and y.

* gdk/linux-fb/gdkglobals-fb.c:
Removed gdk_fb_pointer_grab_window_events,
added _gdk_fb_pointer_grab_owner_events and
_gdk_fb_keyboard_grab_owner_events.

* gdk/linux-fb/gdkmain-fb.c (gdk_fb_pointer_grab):
Set all button mask if GDK_BUTTON_MOTION_MASK set. Send
crossing events before grabbing. Set _gdk_fb_pointer_grab_owner_events.
(gdk_fb_pointer_ungrab): Unset _gdk_fb_pointer_grab_owner_events
Send crossing events after ungrab finished.
(gdk_keyboard_grab): Set ..._owner_events
(type_masks): Move out of function.
(gdk_fb_other_event_window, gdk_fb_pointer_event_window,
gdk_fb_keyboard_event_window): New functions, return the
window an event should be targeted at. Handles grabs and
event propagation. Can return NULL.
(gdk_event_make): Remove event_mask checking. Now always
returns an event.

* gdk/linux-fb/gdkkeyboard-fb.c:
* gdk/linux-fb/gdkproperty-fb.c:
* gdk/linux-fb/gdkselection-fb.c:
Use new event_window/gdk_event_make() behaviour.

* gdk/linux-fb/gdkmouse-fb.c:
Use new event_window/gdk_event_make() behaviour.
Only send motion events if in the same window.
If grabbed, use cursor from window if sibling of grabbed
window, and cursor from grabbed window otherwise.

* gdk/linux-fb/gdkprivate-fb.h:
Update gdk_fb_window_send_crossing_events, gdk_event_make
and grab varaible declarations. Add gdk_fb_*_event_window().

* gdk/linux-fb/gdkwindow-fb.c:
Use new event_window/gdk_event_make() behaviour.
Keep correct track of focus window.
(gdk_window_set_events): Set all specific button motion masks
if GDK_BUTTON_MOTION_MASK set.

* gtk/gtkdnd.c (gtk_drag_update):
Free info->last_event if gdk_drag_motion returned FALSE.

17 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gdk/linux-fb/gdkdrawable-fb2.c
gdk/linux-fb/gdkglobals-fb.c
gdk/linux-fb/gdkkeyboard-fb.c
gdk/linux-fb/gdkmain-fb.c
gdk/linux-fb/gdkmouse-fb.c
gdk/linux-fb/gdkprivate-fb.h
gdk/linux-fb/gdkproperty-fb.c
gdk/linux-fb/gdkselection-fb.c
gdk/linux-fb/gdkwindow-fb.c
gtk/gtkdnd.c

index 64097ce0b6586059819a72ac646140f0d18866f7..c4b8d2bafaf368e33201a9a2ab6dce4b1a1fda81 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,51 @@
+2001-01-17    <alexl@redhat.com>
+
+       * gdk/linux-fb/gdkdrawable-fb2.c (gdk_shadow_fb_draw_arc):
+       Doh! Mixed up x and y.
+
+       * gdk/linux-fb/gdkglobals-fb.c:
+       Removed gdk_fb_pointer_grab_window_events,
+       added _gdk_fb_pointer_grab_owner_events and
+       _gdk_fb_keyboard_grab_owner_events.
+
+       * gdk/linux-fb/gdkmain-fb.c (gdk_fb_pointer_grab):
+       Set all button mask if GDK_BUTTON_MOTION_MASK set. Send
+       crossing events before grabbing. Set _gdk_fb_pointer_grab_owner_events.
+       (gdk_fb_pointer_ungrab): Unset _gdk_fb_pointer_grab_owner_events
+       Send crossing events after ungrab finished.
+       (gdk_keyboard_grab): Set ..._owner_events
+       (type_masks): Move out of function.
+       (gdk_fb_other_event_window, gdk_fb_pointer_event_window,
+       gdk_fb_keyboard_event_window): New functions, return the
+       window an event should be targeted at. Handles grabs and
+       event propagation. Can return NULL.
+       (gdk_event_make): Remove event_mask checking. Now always
+       returns an event.
+               
+       * gdk/linux-fb/gdkkeyboard-fb.c:
+       * gdk/linux-fb/gdkproperty-fb.c:
+       * gdk/linux-fb/gdkselection-fb.c:
+       Use new event_window/gdk_event_make() behaviour.
+       
+       * gdk/linux-fb/gdkmouse-fb.c:
+       Use new event_window/gdk_event_make() behaviour.
+       Only send motion events if in the same window.
+       If grabbed, use cursor from window if sibling of grabbed
+       window, and cursor from grabbed window otherwise.
+
+       * gdk/linux-fb/gdkprivate-fb.h:
+       Update gdk_fb_window_send_crossing_events, gdk_event_make
+       and grab varaible declarations. Add gdk_fb_*_event_window().
+
+       * gdk/linux-fb/gdkwindow-fb.c:
+       Use new event_window/gdk_event_make() behaviour.
+       Keep correct track of focus window.
+       (gdk_window_set_events): Set all specific button motion masks
+       if GDK_BUTTON_MOTION_MASK set.
+
+       * gtk/gtkdnd.c (gtk_drag_update):
+       Free info->last_event if gdk_drag_motion returned FALSE.
+
 Tue Jan 16 13:13:13 GMT 2001  Tony Gale <gale@gtk.org>
 
        * docs/faq/gtk-faq.sgml: FAQ update:
index 64097ce0b6586059819a72ac646140f0d18866f7..c4b8d2bafaf368e33201a9a2ab6dce4b1a1fda81 100644 (file)
@@ -1,3 +1,51 @@
+2001-01-17    <alexl@redhat.com>
+
+       * gdk/linux-fb/gdkdrawable-fb2.c (gdk_shadow_fb_draw_arc):
+       Doh! Mixed up x and y.
+
+       * gdk/linux-fb/gdkglobals-fb.c:
+       Removed gdk_fb_pointer_grab_window_events,
+       added _gdk_fb_pointer_grab_owner_events and
+       _gdk_fb_keyboard_grab_owner_events.
+
+       * gdk/linux-fb/gdkmain-fb.c (gdk_fb_pointer_grab):
+       Set all button mask if GDK_BUTTON_MOTION_MASK set. Send
+       crossing events before grabbing. Set _gdk_fb_pointer_grab_owner_events.
+       (gdk_fb_pointer_ungrab): Unset _gdk_fb_pointer_grab_owner_events
+       Send crossing events after ungrab finished.
+       (gdk_keyboard_grab): Set ..._owner_events
+       (type_masks): Move out of function.
+       (gdk_fb_other_event_window, gdk_fb_pointer_event_window,
+       gdk_fb_keyboard_event_window): New functions, return the
+       window an event should be targeted at. Handles grabs and
+       event propagation. Can return NULL.
+       (gdk_event_make): Remove event_mask checking. Now always
+       returns an event.
+               
+       * gdk/linux-fb/gdkkeyboard-fb.c:
+       * gdk/linux-fb/gdkproperty-fb.c:
+       * gdk/linux-fb/gdkselection-fb.c:
+       Use new event_window/gdk_event_make() behaviour.
+       
+       * gdk/linux-fb/gdkmouse-fb.c:
+       Use new event_window/gdk_event_make() behaviour.
+       Only send motion events if in the same window.
+       If grabbed, use cursor from window if sibling of grabbed
+       window, and cursor from grabbed window otherwise.
+
+       * gdk/linux-fb/gdkprivate-fb.h:
+       Update gdk_fb_window_send_crossing_events, gdk_event_make
+       and grab varaible declarations. Add gdk_fb_*_event_window().
+
+       * gdk/linux-fb/gdkwindow-fb.c:
+       Use new event_window/gdk_event_make() behaviour.
+       Keep correct track of focus window.
+       (gdk_window_set_events): Set all specific button motion masks
+       if GDK_BUTTON_MOTION_MASK set.
+
+       * gtk/gtkdnd.c (gtk_drag_update):
+       Free info->last_event if gdk_drag_motion returned FALSE.
+
 Tue Jan 16 13:13:13 GMT 2001  Tony Gale <gale@gtk.org>
 
        * docs/faq/gtk-faq.sgml: FAQ update:
index 64097ce0b6586059819a72ac646140f0d18866f7..c4b8d2bafaf368e33201a9a2ab6dce4b1a1fda81 100644 (file)
@@ -1,3 +1,51 @@
+2001-01-17    <alexl@redhat.com>
+
+       * gdk/linux-fb/gdkdrawable-fb2.c (gdk_shadow_fb_draw_arc):
+       Doh! Mixed up x and y.
+
+       * gdk/linux-fb/gdkglobals-fb.c:
+       Removed gdk_fb_pointer_grab_window_events,
+       added _gdk_fb_pointer_grab_owner_events and
+       _gdk_fb_keyboard_grab_owner_events.
+
+       * gdk/linux-fb/gdkmain-fb.c (gdk_fb_pointer_grab):
+       Set all button mask if GDK_BUTTON_MOTION_MASK set. Send
+       crossing events before grabbing. Set _gdk_fb_pointer_grab_owner_events.
+       (gdk_fb_pointer_ungrab): Unset _gdk_fb_pointer_grab_owner_events
+       Send crossing events after ungrab finished.
+       (gdk_keyboard_grab): Set ..._owner_events
+       (type_masks): Move out of function.
+       (gdk_fb_other_event_window, gdk_fb_pointer_event_window,
+       gdk_fb_keyboard_event_window): New functions, return the
+       window an event should be targeted at. Handles grabs and
+       event propagation. Can return NULL.
+       (gdk_event_make): Remove event_mask checking. Now always
+       returns an event.
+               
+       * gdk/linux-fb/gdkkeyboard-fb.c:
+       * gdk/linux-fb/gdkproperty-fb.c:
+       * gdk/linux-fb/gdkselection-fb.c:
+       Use new event_window/gdk_event_make() behaviour.
+       
+       * gdk/linux-fb/gdkmouse-fb.c:
+       Use new event_window/gdk_event_make() behaviour.
+       Only send motion events if in the same window.
+       If grabbed, use cursor from window if sibling of grabbed
+       window, and cursor from grabbed window otherwise.
+
+       * gdk/linux-fb/gdkprivate-fb.h:
+       Update gdk_fb_window_send_crossing_events, gdk_event_make
+       and grab varaible declarations. Add gdk_fb_*_event_window().
+
+       * gdk/linux-fb/gdkwindow-fb.c:
+       Use new event_window/gdk_event_make() behaviour.
+       Keep correct track of focus window.
+       (gdk_window_set_events): Set all specific button motion masks
+       if GDK_BUTTON_MOTION_MASK set.
+
+       * gtk/gtkdnd.c (gtk_drag_update):
+       Free info->last_event if gdk_drag_motion returned FALSE.
+
 Tue Jan 16 13:13:13 GMT 2001  Tony Gale <gale@gtk.org>
 
        * docs/faq/gtk-faq.sgml: FAQ update:
index 64097ce0b6586059819a72ac646140f0d18866f7..c4b8d2bafaf368e33201a9a2ab6dce4b1a1fda81 100644 (file)
@@ -1,3 +1,51 @@
+2001-01-17    <alexl@redhat.com>
+
+       * gdk/linux-fb/gdkdrawable-fb2.c (gdk_shadow_fb_draw_arc):
+       Doh! Mixed up x and y.
+
+       * gdk/linux-fb/gdkglobals-fb.c:
+       Removed gdk_fb_pointer_grab_window_events,
+       added _gdk_fb_pointer_grab_owner_events and
+       _gdk_fb_keyboard_grab_owner_events.
+
+       * gdk/linux-fb/gdkmain-fb.c (gdk_fb_pointer_grab):
+       Set all button mask if GDK_BUTTON_MOTION_MASK set. Send
+       crossing events before grabbing. Set _gdk_fb_pointer_grab_owner_events.
+       (gdk_fb_pointer_ungrab): Unset _gdk_fb_pointer_grab_owner_events
+       Send crossing events after ungrab finished.
+       (gdk_keyboard_grab): Set ..._owner_events
+       (type_masks): Move out of function.
+       (gdk_fb_other_event_window, gdk_fb_pointer_event_window,
+       gdk_fb_keyboard_event_window): New functions, return the
+       window an event should be targeted at. Handles grabs and
+       event propagation. Can return NULL.
+       (gdk_event_make): Remove event_mask checking. Now always
+       returns an event.
+               
+       * gdk/linux-fb/gdkkeyboard-fb.c:
+       * gdk/linux-fb/gdkproperty-fb.c:
+       * gdk/linux-fb/gdkselection-fb.c:
+       Use new event_window/gdk_event_make() behaviour.
+       
+       * gdk/linux-fb/gdkmouse-fb.c:
+       Use new event_window/gdk_event_make() behaviour.
+       Only send motion events if in the same window.
+       If grabbed, use cursor from window if sibling of grabbed
+       window, and cursor from grabbed window otherwise.
+
+       * gdk/linux-fb/gdkprivate-fb.h:
+       Update gdk_fb_window_send_crossing_events, gdk_event_make
+       and grab varaible declarations. Add gdk_fb_*_event_window().
+
+       * gdk/linux-fb/gdkwindow-fb.c:
+       Use new event_window/gdk_event_make() behaviour.
+       Keep correct track of focus window.
+       (gdk_window_set_events): Set all specific button motion masks
+       if GDK_BUTTON_MOTION_MASK set.
+
+       * gtk/gtkdnd.c (gtk_drag_update):
+       Free info->last_event if gdk_drag_motion returned FALSE.
+
 Tue Jan 16 13:13:13 GMT 2001  Tony Gale <gale@gtk.org>
 
        * docs/faq/gtk-faq.sgml: FAQ update:
index 64097ce0b6586059819a72ac646140f0d18866f7..c4b8d2bafaf368e33201a9a2ab6dce4b1a1fda81 100644 (file)
@@ -1,3 +1,51 @@
+2001-01-17    <alexl@redhat.com>
+
+       * gdk/linux-fb/gdkdrawable-fb2.c (gdk_shadow_fb_draw_arc):
+       Doh! Mixed up x and y.
+
+       * gdk/linux-fb/gdkglobals-fb.c:
+       Removed gdk_fb_pointer_grab_window_events,
+       added _gdk_fb_pointer_grab_owner_events and
+       _gdk_fb_keyboard_grab_owner_events.
+
+       * gdk/linux-fb/gdkmain-fb.c (gdk_fb_pointer_grab):
+       Set all button mask if GDK_BUTTON_MOTION_MASK set. Send
+       crossing events before grabbing. Set _gdk_fb_pointer_grab_owner_events.
+       (gdk_fb_pointer_ungrab): Unset _gdk_fb_pointer_grab_owner_events
+       Send crossing events after ungrab finished.
+       (gdk_keyboard_grab): Set ..._owner_events
+       (type_masks): Move out of function.
+       (gdk_fb_other_event_window, gdk_fb_pointer_event_window,
+       gdk_fb_keyboard_event_window): New functions, return the
+       window an event should be targeted at. Handles grabs and
+       event propagation. Can return NULL.
+       (gdk_event_make): Remove event_mask checking. Now always
+       returns an event.
+               
+       * gdk/linux-fb/gdkkeyboard-fb.c:
+       * gdk/linux-fb/gdkproperty-fb.c:
+       * gdk/linux-fb/gdkselection-fb.c:
+       Use new event_window/gdk_event_make() behaviour.
+       
+       * gdk/linux-fb/gdkmouse-fb.c:
+       Use new event_window/gdk_event_make() behaviour.
+       Only send motion events if in the same window.
+       If grabbed, use cursor from window if sibling of grabbed
+       window, and cursor from grabbed window otherwise.
+
+       * gdk/linux-fb/gdkprivate-fb.h:
+       Update gdk_fb_window_send_crossing_events, gdk_event_make
+       and grab varaible declarations. Add gdk_fb_*_event_window().
+
+       * gdk/linux-fb/gdkwindow-fb.c:
+       Use new event_window/gdk_event_make() behaviour.
+       Keep correct track of focus window.
+       (gdk_window_set_events): Set all specific button motion masks
+       if GDK_BUTTON_MOTION_MASK set.
+
+       * gtk/gtkdnd.c (gtk_drag_update):
+       Free info->last_event if gdk_drag_motion returned FALSE.
+
 Tue Jan 16 13:13:13 GMT 2001  Tony Gale <gale@gtk.org>
 
        * docs/faq/gtk-faq.sgml: FAQ update:
index 64097ce0b6586059819a72ac646140f0d18866f7..c4b8d2bafaf368e33201a9a2ab6dce4b1a1fda81 100644 (file)
@@ -1,3 +1,51 @@
+2001-01-17    <alexl@redhat.com>
+
+       * gdk/linux-fb/gdkdrawable-fb2.c (gdk_shadow_fb_draw_arc):
+       Doh! Mixed up x and y.
+
+       * gdk/linux-fb/gdkglobals-fb.c:
+       Removed gdk_fb_pointer_grab_window_events,
+       added _gdk_fb_pointer_grab_owner_events and
+       _gdk_fb_keyboard_grab_owner_events.
+
+       * gdk/linux-fb/gdkmain-fb.c (gdk_fb_pointer_grab):
+       Set all button mask if GDK_BUTTON_MOTION_MASK set. Send
+       crossing events before grabbing. Set _gdk_fb_pointer_grab_owner_events.
+       (gdk_fb_pointer_ungrab): Unset _gdk_fb_pointer_grab_owner_events
+       Send crossing events after ungrab finished.
+       (gdk_keyboard_grab): Set ..._owner_events
+       (type_masks): Move out of function.
+       (gdk_fb_other_event_window, gdk_fb_pointer_event_window,
+       gdk_fb_keyboard_event_window): New functions, return the
+       window an event should be targeted at. Handles grabs and
+       event propagation. Can return NULL.
+       (gdk_event_make): Remove event_mask checking. Now always
+       returns an event.
+               
+       * gdk/linux-fb/gdkkeyboard-fb.c:
+       * gdk/linux-fb/gdkproperty-fb.c:
+       * gdk/linux-fb/gdkselection-fb.c:
+       Use new event_window/gdk_event_make() behaviour.
+       
+       * gdk/linux-fb/gdkmouse-fb.c:
+       Use new event_window/gdk_event_make() behaviour.
+       Only send motion events if in the same window.
+       If grabbed, use cursor from window if sibling of grabbed
+       window, and cursor from grabbed window otherwise.
+
+       * gdk/linux-fb/gdkprivate-fb.h:
+       Update gdk_fb_window_send_crossing_events, gdk_event_make
+       and grab varaible declarations. Add gdk_fb_*_event_window().
+
+       * gdk/linux-fb/gdkwindow-fb.c:
+       Use new event_window/gdk_event_make() behaviour.
+       Keep correct track of focus window.
+       (gdk_window_set_events): Set all specific button motion masks
+       if GDK_BUTTON_MOTION_MASK set.
+
+       * gtk/gtkdnd.c (gtk_drag_update):
+       Free info->last_event if gdk_drag_motion returned FALSE.
+
 Tue Jan 16 13:13:13 GMT 2001  Tony Gale <gale@gtk.org>
 
        * docs/faq/gtk-faq.sgml: FAQ update:
index 64097ce0b6586059819a72ac646140f0d18866f7..c4b8d2bafaf368e33201a9a2ab6dce4b1a1fda81 100644 (file)
@@ -1,3 +1,51 @@
+2001-01-17    <alexl@redhat.com>
+
+       * gdk/linux-fb/gdkdrawable-fb2.c (gdk_shadow_fb_draw_arc):
+       Doh! Mixed up x and y.
+
+       * gdk/linux-fb/gdkglobals-fb.c:
+       Removed gdk_fb_pointer_grab_window_events,
+       added _gdk_fb_pointer_grab_owner_events and
+       _gdk_fb_keyboard_grab_owner_events.
+
+       * gdk/linux-fb/gdkmain-fb.c (gdk_fb_pointer_grab):
+       Set all button mask if GDK_BUTTON_MOTION_MASK set. Send
+       crossing events before grabbing. Set _gdk_fb_pointer_grab_owner_events.
+       (gdk_fb_pointer_ungrab): Unset _gdk_fb_pointer_grab_owner_events
+       Send crossing events after ungrab finished.
+       (gdk_keyboard_grab): Set ..._owner_events
+       (type_masks): Move out of function.
+       (gdk_fb_other_event_window, gdk_fb_pointer_event_window,
+       gdk_fb_keyboard_event_window): New functions, return the
+       window an event should be targeted at. Handles grabs and
+       event propagation. Can return NULL.
+       (gdk_event_make): Remove event_mask checking. Now always
+       returns an event.
+               
+       * gdk/linux-fb/gdkkeyboard-fb.c:
+       * gdk/linux-fb/gdkproperty-fb.c:
+       * gdk/linux-fb/gdkselection-fb.c:
+       Use new event_window/gdk_event_make() behaviour.
+       
+       * gdk/linux-fb/gdkmouse-fb.c:
+       Use new event_window/gdk_event_make() behaviour.
+       Only send motion events if in the same window.
+       If grabbed, use cursor from window if sibling of grabbed
+       window, and cursor from grabbed window otherwise.
+
+       * gdk/linux-fb/gdkprivate-fb.h:
+       Update gdk_fb_window_send_crossing_events, gdk_event_make
+       and grab varaible declarations. Add gdk_fb_*_event_window().
+
+       * gdk/linux-fb/gdkwindow-fb.c:
+       Use new event_window/gdk_event_make() behaviour.
+       Keep correct track of focus window.
+       (gdk_window_set_events): Set all specific button motion masks
+       if GDK_BUTTON_MOTION_MASK set.
+
+       * gtk/gtkdnd.c (gtk_drag_update):
+       Free info->last_event if gdk_drag_motion returned FALSE.
+
 Tue Jan 16 13:13:13 GMT 2001  Tony Gale <gale@gtk.org>
 
        * docs/faq/gtk-faq.sgml: FAQ update:
index ba6387e8f078856bbda092ebcba30358cc165601..0d476779a71fb0f4ad36ef113c9e2eba2f372c09 100644 (file)
@@ -1249,9 +1249,9 @@ gdk_shadow_fb_draw_arc (GdkDrawable      *drawable,
       gint extra_width;
   
       minx = x + private->abs_x;
-      miny = x + private->abs_y;
+      miny = y + private->abs_y;
       maxx = x + width + private->abs_x;
-      maxy = y + height + private->abs_x;
+      maxy = y + height + private->abs_y;
       
       if (!filled)
        {
index cab2c87383cdeb53ee5bda355250b403a61abf66..a48852f30955b82d5e522fbb9b28afeca0f4e737 100644 (file)
@@ -33,7 +33,9 @@
 const gchar            *gdk_progclass = "none";
 gboolean          gdk_null_window_warnings = TRUE;
 
-GdkWindow *_gdk_fb_pointer_grab_window, *_gdk_fb_pointer_grab_window_events, *_gdk_fb_keyboard_grab_window, *_gdk_fb_pointer_grab_confine = NULL;
+GdkWindow *_gdk_fb_pointer_grab_window, *_gdk_fb_keyboard_grab_window, *_gdk_fb_pointer_grab_confine = NULL;
+gboolean _gdk_fb_pointer_grab_owner_events;
+gboolean _gdk_fb_keyboard_grab_owner_events;
 GdkEventMask _gdk_fb_pointer_grab_events, _gdk_fb_keyboard_grab_events;
 
 GdkFBWindow *gdk_root_window = NULL;
index 812694701a2de9a5cc8169db1b956275425b6077..7b1eb00dd078f0dae0e0a58ffad66c1c62ad4de8 100644 (file)
@@ -371,12 +371,14 @@ gdk_fb_handle_key (guint hw_keycode,
        gdk_fb_redraw_all ();
     }
 
-  win = gdk_fb_window_find_focus ();
-  event = gdk_event_make (win,
-                         key_up ? GDK_KEY_RELEASE : GDK_KEY_PRESS,
-                         TRUE);
-  if (event)
+  win = gdk_fb_keyboard_event_window (gdk_fb_window_find_focus (),
+                                     key_up ? GDK_KEY_RELEASE : GDK_KEY_PRESS);
+  if (win)
     {
+      event = gdk_event_make (win,
+                             key_up ? GDK_KEY_RELEASE : GDK_KEY_PRESS,
+                             TRUE);
+    
       event->key.state = modifier_state;
       event->key.keyval = keyval;
       event->key.string = string;
index 63f914feb743af90440d7882ef02b5ed6b8336e8..a25618ac2a996aa229dbec76c97c1ba3901cf222 100644 (file)
@@ -743,21 +743,30 @@ gdk_fb_pointer_grab (GdkWindow *    window,
       gdk_pointer_ungrab (time);
     }
 
+  gdk_fb_window_send_crossing_events (NULL,
+                                     window,
+                                     GDK_CROSSING_GRAB);  
+
+  if (event_mask & GDK_BUTTON_MOTION_MASK)
+      event_mask |=
+       GDK_BUTTON1_MOTION_MASK |
+       GDK_BUTTON2_MOTION_MASK |
+       GDK_BUTTON3_MOTION_MASK;
+  
   _gdk_fb_pointer_implicit_grab = implicit_grab;
 
   _gdk_fb_pointer_grab_window = gdk_window_ref (window);
-  _gdk_fb_pointer_grab_window_events = owner_events ? NULL : _gdk_fb_pointer_grab_window;
+  _gdk_fb_pointer_grab_owner_events = owner_events;
 
   _gdk_fb_pointer_grab_confine = confine_to ? gdk_window_ref (confine_to) : NULL;
   _gdk_fb_pointer_grab_events = event_mask;
   _gdk_fb_pointer_grab_cursor = cursor ? gdk_cursor_ref (cursor) : NULL;
 
+
+  
   if (cursor)
     gdk_fb_cursor_reset ();
 
-  gdk_fb_window_send_crossing_events (window,
-                                     GDK_CROSSING_GRAB);  
-  
   return GDK_GRAB_SUCCESS;
 }
 
@@ -787,6 +796,7 @@ gdk_fb_pointer_ungrab (guint32 time, gboolean implicit_grab)
 {
   gboolean have_grab_cursor = _gdk_fb_pointer_grab_cursor && 1;
   GdkWindow *mousewin;
+  GdkWindow *old_grab_window;
   
   if (!_gdk_fb_pointer_grab_window)
     return;
@@ -805,16 +815,19 @@ gdk_fb_pointer_ungrab (guint32 time, gboolean implicit_grab)
   if (have_grab_cursor)
     gdk_fb_cursor_reset ();
 
-  mousewin = gdk_window_at_pointer (NULL, NULL);
-  gdk_fb_window_send_crossing_events (mousewin,
-                                     GDK_CROSSING_UNGRAB);  
+  old_grab_window = _gdk_fb_pointer_grab_window;
   
-  if (_gdk_fb_pointer_grab_window)
-    gdk_window_unref (_gdk_fb_pointer_grab_window);
   _gdk_fb_pointer_grab_window = NULL;
-  _gdk_fb_pointer_grab_window_events = NULL;
 
   _gdk_fb_pointer_implicit_grab = FALSE;
+
+  mousewin = gdk_window_at_pointer (NULL, NULL);
+  gdk_fb_window_send_crossing_events (old_grab_window,
+                                     mousewin,
+                                     GDK_CROSSING_UNGRAB);
+  
+  if (old_grab_window)
+    gdk_window_unref (old_grab_window);
 }
 
 /*
@@ -869,8 +882,8 @@ gdk_keyboard_grab (GdkWindow *         window,
   if (_gdk_fb_pointer_grab_window)
     gdk_keyboard_ungrab (time);
 
-  if (!owner_events)
-    _gdk_fb_keyboard_grab_window = gdk_window_ref (window);
+  _gdk_fb_keyboard_grab_window = gdk_window_ref (window);
+  _gdk_fb_keyboard_grab_owner_events = owner_events;
   
   return GDK_GRAB_SUCCESS;
 }
@@ -1074,150 +1087,259 @@ gdk_beep (void)
 }
 
 /* utils */
-GdkEvent *
-gdk_event_make (GdkWindow *window,
-               GdkEventType type,
-               gboolean append_to_queue)
-{
-  static const guint type_masks[] = {
-    GDK_SUBSTRUCTURE_MASK, /* GDK_DELETE               = 0, */
-    GDK_STRUCTURE_MASK, /* GDK_DESTROY         = 1, */
-    GDK_EXPOSURE_MASK, /* GDK_EXPOSE           = 2, */
-    GDK_POINTER_MOTION_MASK, /* GDK_MOTION_NOTIFY      = 3, */
-    GDK_BUTTON_PRESS_MASK, /* GDK_BUTTON_PRESS = 4, */
-    GDK_BUTTON_PRESS_MASK, /* GDK_2BUTTON_PRESS        = 5, */
-    GDK_BUTTON_PRESS_MASK, /* GDK_3BUTTON_PRESS        = 6, */
-    GDK_BUTTON_RELEASE_MASK, /* GDK_BUTTON_RELEASE     = 7, */
-    GDK_KEY_PRESS_MASK, /* GDK_KEY_PRESS       = 8, */
-    GDK_KEY_RELEASE_MASK, /* GDK_KEY_RELEASE   = 9, */
-    GDK_ENTER_NOTIFY_MASK, /* GDK_ENTER_NOTIFY = 10, */
-    GDK_LEAVE_NOTIFY_MASK, /* GDK_LEAVE_NOTIFY = 11, */
-    GDK_FOCUS_CHANGE_MASK, /* GDK_FOCUS_CHANGE = 12, */
-    GDK_STRUCTURE_MASK, /* GDK_CONFIGURE               = 13, */
-    GDK_VISIBILITY_NOTIFY_MASK, /* GDK_MAP             = 14, */
-    GDK_VISIBILITY_NOTIFY_MASK, /* GDK_UNMAP           = 15, */
-    GDK_PROPERTY_CHANGE_MASK, /* GDK_PROPERTY_NOTIFY   = 16, */
-    GDK_PROPERTY_CHANGE_MASK, /* GDK_SELECTION_CLEAR   = 17, */
-    GDK_PROPERTY_CHANGE_MASK, /* GDK_SELECTION_REQUEST = 18, */
-    GDK_PROPERTY_CHANGE_MASK, /* GDK_SELECTION_NOTIFY  = 19, */
-    GDK_PROXIMITY_IN_MASK, /* GDK_PROXIMITY_IN = 20, */
-    GDK_PROXIMITY_OUT_MASK, /* GDK_PROXIMITY_OUT       = 21, */
-    GDK_ALL_EVENTS_MASK, /* GDK_DRAG_ENTER        = 22, */
-    GDK_ALL_EVENTS_MASK, /* GDK_DRAG_LEAVE        = 23, */
-    GDK_ALL_EVENTS_MASK, /* GDK_DRAG_MOTION       = 24, */
-    GDK_ALL_EVENTS_MASK, /* GDK_DRAG_STATUS       = 25, */
-    GDK_ALL_EVENTS_MASK, /* GDK_DROP_START        = 26, */
-    GDK_ALL_EVENTS_MASK, /* GDK_DROP_FINISHED     = 27, */
-    GDK_ALL_EVENTS_MASK, /* GDK_CLIENT_EVENT   = 28, */
-    GDK_VISIBILITY_NOTIFY_MASK, /* GDK_VISIBILITY_NOTIFY = 29, */
-    GDK_EXPOSURE_MASK, /* GDK_NO_EXPOSE                = 30, */
-    GDK_SCROLL_MASK /* GDK_SCROLL            = 31 */
-  };
-  guint evmask;
-
-  evmask = GDK_WINDOW_IMPL_FBDATA(window)->event_mask;
+static const guint type_masks[] = {
+  GDK_SUBSTRUCTURE_MASK, /* GDK_DELETE         = 0, */
+  GDK_STRUCTURE_MASK, /* GDK_DESTROY           = 1, */
+  GDK_EXPOSURE_MASK, /* GDK_EXPOSE             = 2, */
+  GDK_POINTER_MOTION_MASK, /* GDK_MOTION_NOTIFY        = 3, */
+  GDK_BUTTON_PRESS_MASK, /* GDK_BUTTON_PRESS   = 4, */
+  GDK_BUTTON_PRESS_MASK, /* GDK_2BUTTON_PRESS  = 5, */
+  GDK_BUTTON_PRESS_MASK, /* GDK_3BUTTON_PRESS  = 6, */
+  GDK_BUTTON_RELEASE_MASK, /* GDK_BUTTON_RELEASE       = 7, */
+  GDK_KEY_PRESS_MASK, /* GDK_KEY_PRESS = 8, */
+  GDK_KEY_RELEASE_MASK, /* GDK_KEY_RELEASE     = 9, */
+  GDK_ENTER_NOTIFY_MASK, /* GDK_ENTER_NOTIFY   = 10, */
+  GDK_LEAVE_NOTIFY_MASK, /* GDK_LEAVE_NOTIFY   = 11, */
+  GDK_FOCUS_CHANGE_MASK, /* GDK_FOCUS_CHANGE   = 12, */
+  GDK_STRUCTURE_MASK, /* GDK_CONFIGURE         = 13, */
+  GDK_VISIBILITY_NOTIFY_MASK, /* GDK_MAP               = 14, */
+  GDK_VISIBILITY_NOTIFY_MASK, /* GDK_UNMAP             = 15, */
+  GDK_PROPERTY_CHANGE_MASK, /* GDK_PROPERTY_NOTIFY     = 16, */
+  GDK_PROPERTY_CHANGE_MASK, /* GDK_SELECTION_CLEAR     = 17, */
+  GDK_PROPERTY_CHANGE_MASK, /* GDK_SELECTION_REQUEST = 18, */
+  GDK_PROPERTY_CHANGE_MASK, /* GDK_SELECTION_NOTIFY    = 19, */
+  GDK_PROXIMITY_IN_MASK, /* GDK_PROXIMITY_IN   = 20, */
+  GDK_PROXIMITY_OUT_MASK, /* GDK_PROXIMITY_OUT = 21, */
+  GDK_ALL_EVENTS_MASK, /* GDK_DRAG_ENTER        = 22, */
+  GDK_ALL_EVENTS_MASK, /* GDK_DRAG_LEAVE        = 23, */
+  GDK_ALL_EVENTS_MASK, /* GDK_DRAG_MOTION       = 24, */
+  GDK_ALL_EVENTS_MASK, /* GDK_DRAG_STATUS       = 25, */
+  GDK_ALL_EVENTS_MASK, /* GDK_DROP_START        = 26, */
+  GDK_ALL_EVENTS_MASK, /* GDK_DROP_FINISHED     = 27, */
+  GDK_ALL_EVENTS_MASK, /* GDK_CLIENT_EVENT     = 28, */
+  GDK_VISIBILITY_NOTIFY_MASK, /* GDK_VISIBILITY_NOTIFY = 29, */
+  GDK_EXPOSURE_MASK, /* GDK_NO_EXPOSE          = 30, */
+  GDK_SCROLL_MASK /* GDK_SCROLL            = 31 */
+};
 
-  /* Bad hack to make sure that things work semi-properly with owner_events */
-  if (_gdk_fb_pointer_grab_window)
-    evmask |= _gdk_fb_pointer_grab_events;
-  if (_gdk_fb_keyboard_grab_window)
-    evmask |= _gdk_fb_keyboard_grab_events;
+GdkWindow *
+gdk_fb_other_event_window (GdkWindow *window,
+                          GdkEventType type)
+{
+  guint32 evmask;
+  GdkWindow *w;
 
-  if (evmask & GDK_BUTTON_MOTION_MASK)
+  w = window;
+  while (w != gdk_parent_root)
     {
-      evmask |= GDK_BUTTON1_MOTION_MASK|GDK_BUTTON2_MOTION_MASK|GDK_BUTTON3_MOTION_MASK;
+      /* Huge hack, so that we don't propagate events to GtkWindow->frame */
+      if ((w != window) &&
+         (GDK_WINDOW_P (w)->window_type != GDK_WINDOW_CHILD) &&
+         (g_object_get_data (G_OBJECT (w), "gdk-window-child-handler")))
+         break;
+         
+      evmask = GDK_WINDOW_IMPL_FBDATA(window)->event_mask;
+
+      if (evmask & type_masks[type])
+       return w;
+      
+      w = gdk_window_get_parent (w);
     }
+  
+  return NULL;
+}
 
-  if (evmask & (GDK_BUTTON1_MOTION_MASK|GDK_BUTTON2_MOTION_MASK|GDK_BUTTON3_MOTION_MASK))
+GdkWindow *
+gdk_fb_pointer_event_window (GdkWindow *window,
+                            GdkEventType type)
+{
+  guint evmask;
+  GdkModifierType mask;
+  GdkWindow *w;
+         
+  gdk_fb_mouse_get_info (NULL, NULL, &mask);
+  
+  if (_gdk_fb_pointer_grab_window &&
+      !_gdk_fb_pointer_grab_owner_events)
     {
-      GdkModifierType mask;
+      evmask = _gdk_fb_pointer_grab_events;
 
-      gdk_fb_mouse_get_info (NULL, NULL, &mask);
+      if (evmask & (GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK | GDK_BUTTON3_MOTION_MASK))
+       {
+         if (((mask & GDK_BUTTON1_MASK) && (evmask & GDK_BUTTON1_MOTION_MASK)) ||
+             ((mask & GDK_BUTTON2_MASK) && (evmask & GDK_BUTTON2_MOTION_MASK)) ||
+             ((mask & GDK_BUTTON3_MASK) && (evmask & GDK_BUTTON3_MOTION_MASK)))
+           evmask |= GDK_POINTER_MOTION_MASK;
+       }
 
-      if (((mask & GDK_BUTTON1_MASK) && (evmask & GDK_BUTTON1_MOTION_MASK)) ||
-         ((mask & GDK_BUTTON2_MASK) && (evmask & GDK_BUTTON2_MOTION_MASK)) ||
-         ((mask & GDK_BUTTON3_MASK) && (evmask & GDK_BUTTON3_MOTION_MASK)))
-       evmask |= GDK_POINTER_MOTION_MASK;
+      if (evmask & type_masks[type])
+       return _gdk_fb_pointer_grab_window;
+      else
+       return NULL;
     }
 
-  if (evmask & type_masks[type])
+  w = window;
+  while (w != gdk_parent_root)
     {
-      GdkEvent *event = gdk_event_new ();
-      guint32 the_time;
-
-      the_time = gdk_fb_get_time ();
-
-      event->any.type = type;
-      event->any.window = gdk_window_ref (window);
-      event->any.send_event = FALSE;
-      switch (type)
-       {
-       case GDK_MOTION_NOTIFY:
-         event->motion.time = the_time;
-         event->motion.axes = NULL;
-         break;
-       case GDK_BUTTON_PRESS:
-       case GDK_2BUTTON_PRESS:
-       case GDK_3BUTTON_PRESS:
-       case GDK_BUTTON_RELEASE:
-         event->button.time = the_time;
-         event->button.axes = NULL;
-         break;
-       case GDK_KEY_PRESS:
-       case GDK_KEY_RELEASE:
-         event->key.time = the_time;
-         break;
-       case GDK_ENTER_NOTIFY:
-       case GDK_LEAVE_NOTIFY:
-         event->crossing.time = the_time;
+      /* Huge hack, so that we don't propagate events to GtkWindow->frame */
+      if ((w != window) &&
+         (GDK_WINDOW_P (w)->window_type != GDK_WINDOW_CHILD) &&
+         (g_object_get_data (G_OBJECT (w), "gdk-window-child-handler")))
          break;
+      
+      evmask = GDK_WINDOW_IMPL_FBDATA(window)->event_mask;
 
-       case GDK_PROPERTY_NOTIFY:
-         event->property.time = the_time;
-         break;
+      if (evmask & (GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK | GDK_BUTTON3_MOTION_MASK))
+       {
+         if (((mask & GDK_BUTTON1_MASK) && (evmask & GDK_BUTTON1_MOTION_MASK)) ||
+             ((mask & GDK_BUTTON2_MASK) && (evmask & GDK_BUTTON2_MOTION_MASK)) ||
+             ((mask & GDK_BUTTON3_MASK) && (evmask & GDK_BUTTON3_MOTION_MASK)))
+           evmask |= GDK_POINTER_MOTION_MASK;
+       }
 
-       case GDK_SELECTION_CLEAR:
-       case GDK_SELECTION_REQUEST:
-       case GDK_SELECTION_NOTIFY:
-         event->selection.time = the_time;
-         break;
-       case GDK_PROXIMITY_IN:
-       case GDK_PROXIMITY_OUT:
-         event->proximity.time = the_time;
-         break;
-       case GDK_DRAG_ENTER:
-       case GDK_DRAG_LEAVE:
-       case GDK_DRAG_MOTION:
-       case GDK_DRAG_STATUS:
-       case GDK_DROP_START:
-       case GDK_DROP_FINISHED:
-         event->dnd.time = the_time;
-         break;
+      if (evmask & type_masks[type])
+       return w;
+      
+      w = gdk_window_get_parent (w);
+    }
 
-       case GDK_FOCUS_CHANGE:
-       case GDK_CONFIGURE:
-       case GDK_MAP:
-       case GDK_UNMAP:
-       case GDK_CLIENT_EVENT:
-       case GDK_VISIBILITY_NOTIFY:
-       case GDK_NO_EXPOSE:
-       case GDK_SCROLL:
-       case GDK_DELETE:
-       case GDK_DESTROY:
-       case GDK_EXPOSE:
-       default:
-         break;
+  if (_gdk_fb_pointer_grab_window &&
+      _gdk_fb_pointer_grab_owner_events)
+    {
+      evmask = _gdk_fb_pointer_grab_events;
+      
+      if (evmask & (GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK | GDK_BUTTON3_MOTION_MASK))
+       {
+         if (((mask & GDK_BUTTON1_MASK) && (evmask & GDK_BUTTON1_MOTION_MASK)) ||
+             ((mask & GDK_BUTTON2_MASK) && (evmask & GDK_BUTTON2_MOTION_MASK)) ||
+             ((mask & GDK_BUTTON3_MASK) && (evmask & GDK_BUTTON3_MOTION_MASK)))
+           evmask |= GDK_POINTER_MOTION_MASK;
        }
+      
+      if (evmask & type_masks[type])
+       return _gdk_fb_pointer_grab_window;
+    }
+  
+  return NULL;
+}
 
-      if (append_to_queue)
-       gdk_event_queue_append (event);
+GdkWindow *
+gdk_fb_keyboard_event_window (GdkWindow *window,
+                             GdkEventType type)
+{
+  guint32 evmask;
+  GdkWindow *w;
+  
+  if (_gdk_fb_keyboard_grab_window &&
+      !_gdk_fb_keyboard_grab_owner_events)
+    {
+      return _gdk_fb_keyboard_grab_window;
+    }
+  
+  w = window;
+  while (w != gdk_parent_root)
+    {
+      /* Huge hack, so that we don't propagate events to GtkWindow->frame */
+      if ((w != window) &&
+         (GDK_WINDOW_P (w)->window_type != GDK_WINDOW_CHILD) &&
+         (g_object_get_data (G_OBJECT (w), "gdk-window-child-handler")))
+         break;
+         
+      evmask = GDK_WINDOW_IMPL_FBDATA(window)->event_mask;
 
-      return event;
+      if (evmask & type_masks[type])
+       return w;
+      
+      w = gdk_window_get_parent (w);
+    }
+  
+  if (_gdk_fb_keyboard_grab_window &&
+      _gdk_fb_keyboard_grab_owner_events)
+    {
+      return _gdk_fb_keyboard_grab_window;
     }
 
   return NULL;
 }
 
+GdkEvent *
+gdk_event_make (GdkWindow *window,
+               GdkEventType type,
+               gboolean append_to_queue)
+{
+  GdkEvent *event = gdk_event_new ();
+  guint32 the_time;
+  
+  the_time = gdk_fb_get_time ();
+  
+  event->any.type = type;
+  event->any.window = gdk_window_ref (window);
+  event->any.send_event = FALSE;
+  switch (type)
+    {
+    case GDK_MOTION_NOTIFY:
+      event->motion.time = the_time;
+      event->motion.axes = NULL;
+      break;
+    case GDK_BUTTON_PRESS:
+    case GDK_2BUTTON_PRESS:
+    case GDK_3BUTTON_PRESS:
+    case GDK_BUTTON_RELEASE:
+      event->button.time = the_time;
+      event->button.axes = NULL;
+      break;
+    case GDK_KEY_PRESS:
+    case GDK_KEY_RELEASE:
+      event->key.time = the_time;
+      break;
+    case GDK_ENTER_NOTIFY:
+    case GDK_LEAVE_NOTIFY:
+      event->crossing.time = the_time;
+      break;
+      
+    case GDK_PROPERTY_NOTIFY:
+      event->property.time = the_time;
+      break;
+      
+    case GDK_SELECTION_CLEAR:
+    case GDK_SELECTION_REQUEST:
+    case GDK_SELECTION_NOTIFY:
+      event->selection.time = the_time;
+      break;
+    case GDK_PROXIMITY_IN:
+    case GDK_PROXIMITY_OUT:
+      event->proximity.time = the_time;
+      break;
+    case GDK_DRAG_ENTER:
+    case GDK_DRAG_LEAVE:
+    case GDK_DRAG_MOTION:
+    case GDK_DRAG_STATUS:
+    case GDK_DROP_START:
+    case GDK_DROP_FINISHED:
+      event->dnd.time = the_time;
+      break;
+      
+    case GDK_FOCUS_CHANGE:
+    case GDK_CONFIGURE:
+    case GDK_MAP:
+    case GDK_UNMAP:
+    case GDK_CLIENT_EVENT:
+    case GDK_VISIBILITY_NOTIFY:
+    case GDK_NO_EXPOSE:
+    case GDK_SCROLL:
+    case GDK_DELETE:
+    case GDK_DESTROY:
+    case GDK_EXPOSE:
+    default:
+      break;
+    }
+  
+  if (append_to_queue)
+    gdk_event_queue_append (event);
+  
+  return event;
+}
+
 void
 gdk_fb_set_rotation (GdkFBAngle angle)
 {
index b4908f45d31dea68ef2b81b54070d54e75d27836..5e6fc3de5c8173d03383c65c7a15bc08460a9402 100644 (file)
@@ -73,10 +73,12 @@ handle_mouse_movement(GdkFBMouse *mouse)
   GdkWindow *mousewin;
   GdkEvent *event;
   gint x, y;
-  GdkWindow *win, *grabwin;
+  GdkWindow *old_win, *win, *event_win, *cursor_win;
   guint state;
   GdkDrawableFBData *mousewin_private;
 
+  old_win = gdk_window_at_pointer (NULL, NULL);
+  
   if (_gdk_fb_pointer_grab_confine)
     mousewin = _gdk_fb_pointer_grab_confine;
   else
@@ -95,25 +97,42 @@ handle_mouse_movement(GdkFBMouse *mouse)
     mouse->y = mousewin_private->lim_y - 1;
 
   win = gdk_window_at_pointer (NULL, NULL);
-  if (_gdk_fb_pointer_grab_window_events)
-    grabwin = _gdk_fb_pointer_grab_window_events;
-  else
-    grabwin = win;
-  
-  gdk_fb_cursor_move (mouse->x, mouse->y, grabwin);
+
+  cursor_win = win;
+  if (_gdk_fb_pointer_grab_window)
+    {
+      GdkWindow *w;
+      
+      cursor_win = _gdk_fb_pointer_grab_window;
+      w = win;
+      while (w != gdk_parent_root)
+       {
+         if (w == _gdk_fb_pointer_grab_window)
+           {
+             cursor_win = win;
+             break;
+           }
+         w = gdk_window_get_parent (w);
+       }
+    }
   
-  gdk_window_get_origin (grabwin, &x, &y);
-  x = mouse->x - x;
-  y = mouse->y - y;
+  gdk_fb_cursor_move (mouse->x, mouse->y, cursor_win);
 
-  state = (mouse->button_pressed[0]?GDK_BUTTON1_MASK:0) |
-    (mouse->button_pressed[1]?GDK_BUTTON2_MASK:0) |
-    (mouse->button_pressed[2]?GDK_BUTTON3_MASK:0) |
-    gdk_fb_keyboard_modifiers ();
+  event_win = gdk_fb_pointer_event_window (win, GDK_MOTION_NOTIFY);
 
-  event = gdk_event_make (grabwin, GDK_MOTION_NOTIFY, TRUE);
-  if (event)
+  if (event_win && (win == old_win))
     {
+      /* Only send motion events in the same window */
+      gdk_window_get_origin (event_win, &x, &y);
+      x = mouse->x - x;
+      y = mouse->y - y;
+
+      state = (mouse->button_pressed[0]?GDK_BUTTON1_MASK:0) |
+       (mouse->button_pressed[1]?GDK_BUTTON2_MASK:0) |
+       (mouse->button_pressed[2]?GDK_BUTTON3_MASK:0) |
+       gdk_fb_keyboard_modifiers ();
+
+      event = gdk_event_make (event_win, GDK_MOTION_NOTIFY, TRUE);
       event->motion.x = x;
       event->motion.y = y;
       event->motion.state = state;
@@ -122,8 +141,8 @@ handle_mouse_movement(GdkFBMouse *mouse)
       event->motion.x_root = mouse->x;
       event->motion.y_root = mouse->y;
     }
-
-  gdk_fb_window_send_crossing_events (win, GDK_CROSSING_NORMAL);
+  
+  gdk_fb_window_send_crossing_events (NULL, win, GDK_CROSSING_NORMAL);
 }
 
 static void
@@ -133,19 +152,20 @@ send_button_event (GdkFBMouse *mouse,
 {
   GdkEvent *event;
   gint x, y, i;
-  GdkWindow *window;
+  GdkWindow *mouse_win;
+  GdkWindow *event_win;
   int nbuttons;
 
-  if (_gdk_fb_pointer_grab_window_events)
-    window = _gdk_fb_pointer_grab_window_events;
-  else
-    window = gdk_window_at_pointer(NULL, NULL);
-
-  event = gdk_event_make (window, press_event ? GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE, FALSE);
-
-  if (event)
+  
+  mouse_win = gdk_window_at_pointer(NULL, NULL);
+  event_win = gdk_fb_pointer_event_window (mouse_win,
+                                          press_event ? GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE);
+  
+  if (event_win)
     {
-      gdk_window_get_origin (window, &x, &y);
+      event = gdk_event_make (event_win, press_event ? GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE, FALSE);
+      
+      gdk_window_get_origin (event_win, &x, &y);
       x = mouse->x - x;
       y = mouse->y - y;
       
@@ -176,8 +196,8 @@ send_button_event (GdkFBMouse *mouse,
   /* Handle implicit button grabs: */
   if (press_event && nbuttons == 1)
     {
-      gdk_fb_pointer_grab (window, FALSE,
-                          gdk_window_get_events (window),
+      gdk_fb_pointer_grab (mouse_win, FALSE,
+                          gdk_window_get_events (mouse_win),
                           NULL, NULL,
                           GDK_CURRENT_TIME, TRUE);
       mouse->click_grab = TRUE;
index 998b44169efb26f13f1679640193e5a24311a224..c390dbcf1c5de64c32aea6ca607e45d729584372 100644 (file)
@@ -262,7 +262,8 @@ void       gdk_window_invalidate_region_clear (GdkWindow       *window,
                                               GdkRegion       *region);
 void       gdk_window_invalidate_rect_clear   (GdkWindow       *window,
                                               GdkRectangle    *rect);
-void       gdk_fb_window_send_crossing_events (GdkWindow       *dest,
+void       gdk_fb_window_send_crossing_events (GdkWindow       *src,
+                                              GdkWindow       *dest,
                                               GdkCrossingMode  mode);
 void       gdk_fb_window_move_resize          (GdkWindow       *window,
                                               gint             x,
@@ -384,14 +385,29 @@ void       gdk_fb_recompute_all            (void);
 
 extern GdkFBAngle _gdk_fb_screen_angle;
 
-extern GdkWindow *_gdk_fb_pointer_grab_window, *_gdk_fb_pointer_grab_window_events, *_gdk_fb_keyboard_grab_window, *_gdk_fb_pointer_grab_confine;
-extern GdkEventMask _gdk_fb_pointer_grab_events, _gdk_fb_keyboard_grab_events;
+/* Pointer grab info */
+extern GdkWindow *_gdk_fb_pointer_grab_window;
+extern gboolean _gdk_fb_pointer_grab_owner_events;
+extern GdkWindow *_gdk_fb_pointer_grab_confine;
+extern GdkEventMask _gdk_fb_pointer_grab_events;
 extern GdkCursor *_gdk_fb_pointer_grab_cursor;
+/* Keyboard grab info */
+extern GdkWindow *_gdk_fb_keyboard_grab_window;
+extern GdkEventMask _gdk_fb_keyboard_grab_events;
+extern gboolean _gdk_fb_keyboard_grab_owner_events;
+
 extern GdkFBDisplay *gdk_display;
 extern GdkDrawableClass _gdk_fb_drawable_class;
 extern FILE *debug_out;
-GdkEvent *gdk_event_make(GdkWindow *window, GdkEventType type, gboolean append_to_queue);
-GdkEvent *gdk_event_make_2(GdkWindow *window, GdkEventType type, gboolean append_to_queue, gint button_press_num);
+GdkEvent *gdk_event_make(GdkWindow *window,
+                        GdkEventType type,
+                        gboolean append_to_queue);
+GdkWindow * gdk_fb_pointer_event_window (GdkWindow *window,
+                                        GdkEventType type);
+GdkWindow *gdk_fb_keyboard_event_window (GdkWindow *window,
+                                        GdkEventType type);
+GdkWindow *gdk_fb_other_event_window (GdkWindow *window,
+                                     GdkEventType type);
 
 void gdk_fb_get_cursor_rect(GdkRectangle *rect);
 gboolean gdk_fb_cursor_need_hide(GdkRectangle *rect);
index fd231865553b9c5c720c349c84edc460443272c1..530622b1508b4ff17c4b4ce69829450865ba3a53 100644 (file)
@@ -54,13 +54,15 @@ gdk_property_delete_2 (GdkWindow *window,
 {
   GdkWindowFBData *fbd = GDK_WINDOW_IMPL_FBDATA(window);
   GdkEvent *event;
+  GdkWindow *event_window;
   
   g_hash_table_remove (fbd->properties, GUINT_TO_POINTER (property));
   g_free (prop);
 
-  event = gdk_event_make (window, GDK_PROPERTY_NOTIFY, TRUE);
-  if (event)
+  event_window = gdk_fb_other_event_window (window, GDK_PROPERTY_NOTIFY);
+  if (event_window)
     {
+      event = gdk_event_make (event_window, GDK_PROPERTY_NOTIFY, TRUE);
       event->property.atom = property;
       event->property.state = GDK_PROPERTY_DELETE;
     }
@@ -147,6 +149,7 @@ gdk_property_change (GdkWindow   *window,
   GdkWindowProperty *prop, *new_prop;
   int new_size = 0;
   GdkEvent *event;
+  GdkWindow *event_window;
 
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
@@ -195,9 +198,10 @@ gdk_property_change (GdkWindow   *window,
   g_hash_table_insert (fbd->properties, GUINT_TO_POINTER (property), new_prop);
   g_free (prop);
 
-  event = gdk_event_make (window, GDK_PROPERTY_NOTIFY, TRUE);
-  if (event)
+  event_window = gdk_fb_other_event_window (window, GDK_PROPERTY_NOTIFY);
+  if (event_window)
     {
+      event = gdk_event_make (event_window, GDK_PROPERTY_NOTIFY, TRUE);
       event->property.atom = property;
       event->property.state = GDK_PROPERTY_NEW_VALUE;
     }
index 91ad6f159b358c01c4a097ccacb04ea63188c950..dc7409da6991142632c332459ddc6483659b2168 100644 (file)
@@ -125,14 +125,16 @@ gdk_selection_convert (GdkWindow *requestor,
 {
   GdkEvent *event;
   GdkWindow *owner;
+  GdkWindow *event_window;
   
   owner = gdk_selection_owner_get (selection);
   
   if (owner)
     {
-      event = gdk_event_make (owner, GDK_SELECTION_REQUEST, TRUE);
-      if (event)
+      event_window = gdk_fb_other_event_window (owner, GDK_SELECTION_REQUEST);
+      if (event_window)
        {
+         event = gdk_event_make (event_window, GDK_SELECTION_REQUEST, TRUE);
          event->selection.requestor = requestor;
          event->selection.selection = selection;
          event->selection.target = target;
@@ -209,10 +211,12 @@ gdk_selection_send_notify (guint32  requestor,
                           guint32  time)
 {
   GdkEvent *event;
+  GdkWindow *event_window;
   
-  event = gdk_event_make (gdk_window_lookup (requestor), GDK_SELECTION_NOTIFY, TRUE);
-  if (event)
+  event_window = gdk_fb_other_event_window (gdk_window_lookup (requestor), GDK_SELECTION_NOTIFY);
+  if (event_window)
     {
+      event = gdk_event_make (event_window, GDK_SELECTION_NOTIFY, TRUE);
       event->selection.selection = selection;
       event->selection.target = target;
       event->selection.property = property;
index ebc4835af9c61b89c929d114a841201518ea702c..d649328301c4fd4e571a390abab69900514c011d 100644 (file)
@@ -36,6 +36,7 @@
 
 /* Global variables: */
 static GdkWindow *gdk_fb_window_containing_pointer = NULL;
+static GdkWindow *gdk_fb_focused_window = NULL;
 static gpointer parent_class = NULL;
 
 static void recompute_drawable (GdkDrawable *drawable);
@@ -315,15 +316,19 @@ send_map_events (GdkWindowObject *private, gboolean is_map)
 {
   GList *l;
   GdkWindow *parent = (GdkWindow *)private->parent;
-
+  GdkWindow *event_win;
+  
   g_assert (is_map);
 
   if (!private->mapped)
     return;
 
   if (is_map)
-    gdk_event_make ((GdkWindow *)private, GDK_MAP, TRUE);
-
+    {
+      event_win = gdk_fb_other_event_window ((GdkWindow *)private, GDK_MAP);
+      if (event_win)
+       gdk_event_make (event_win, GDK_MAP, TRUE);
+    }
   if (private->input_only)
     return;
 
@@ -462,20 +467,15 @@ gdk_fb_redraw_all (void)
 
 
 /* Focus follows pointer */
-GdkWindow *
-_gdk_fb_window_find_focus (GdkWindow *window_with_mouse)
+static GdkWindow *
+gdk_fb_window_find_toplevel (GdkWindow *window)
 {
-  if (_gdk_fb_keyboard_grab_window)
-    return _gdk_fb_keyboard_grab_window;
-  else if (window_with_mouse)
+  GdkWindowObject *priv = (GdkWindowObject *)window;
+  while (priv != (GdkWindowObject *)gdk_parent_root)
     {
-      GdkWindowObject *priv = (GdkWindowObject *)window_with_mouse;
-      while (priv != (GdkWindowObject *)gdk_parent_root)
-       {
-         if ((priv->parent == (GdkWindowObject *)gdk_parent_root) && priv->mapped)
-           return (GdkWindow *)priv;
-         priv = priv->parent;
-       }
+      if ((priv->parent == (GdkWindowObject *)gdk_parent_root) && priv->mapped)
+       return (GdkWindow *)priv;
+      priv = priv->parent;
     }
  
   return gdk_parent_root;
@@ -484,28 +484,49 @@ _gdk_fb_window_find_focus (GdkWindow *window_with_mouse)
 GdkWindow *
 gdk_fb_window_find_focus (void)
 {
-  return _gdk_fb_window_find_focus (gdk_fb_window_containing_pointer);
+  if (_gdk_fb_keyboard_grab_window)
+    return _gdk_fb_keyboard_grab_window;
+  
+  if (!gdk_fb_focused_window)
+    gdk_fb_focused_window = gdk_parent_root;
+  
+  return gdk_fb_focused_window;
 }
 
 
 static void
-gdk_fb_send_focus_change (GdkWindow *old_window_containing_pointer,
-                         GdkWindow *new_window_containing_pointer)
+gdk_fb_change_focus (GdkWindow *new_focus_window)
 {
   GdkEventFocus *event;
   GdkWindow *old_win, *new_win;
-  old_win = _gdk_fb_window_find_focus (old_window_containing_pointer);
-  new_win = _gdk_fb_window_find_focus (new_window_containing_pointer);
+  GdkWindow *event_win;
+
+  /* No focus changes while the pointer is grabbed */
+  if (_gdk_fb_pointer_grab_window)
+    return;
+  
+  old_win = gdk_fb_focused_window;
+  new_win = gdk_fb_window_find_toplevel (new_focus_window);
 
   if (old_win != new_win)
     {
-      event = (GdkEventFocus *)gdk_event_make (old_win, GDK_FOCUS_CHANGE, TRUE);
-      if (event)
-       event->in = FALSE;
-      event = (GdkEventFocus *)gdk_event_make (new_win, GDK_FOCUS_CHANGE, TRUE);
-      if (event)
-       event->in = TRUE;
+      if (old_win)
+       {
+         event_win = gdk_fb_keyboard_event_window (old_win, GDK_FOCUS_CHANGE);
+         if (event_win)
+           {
+             event = (GdkEventFocus *)gdk_event_make (event_win, GDK_FOCUS_CHANGE, TRUE);
+             event->in = FALSE;
+           }
+       }
+      event_win = gdk_fb_keyboard_event_window (new_win, GDK_FOCUS_CHANGE);
+      if (event_win)
+       {
+         event = (GdkEventFocus *)gdk_event_make (event_win, GDK_FOCUS_CHANGE, TRUE);
+         event->in = TRUE;
+       }
     }
+  gdk_fb_focused_window = new_win;
 }
 
 static GdkWindow *
@@ -545,7 +566,8 @@ gdk_fb_find_common_ancestor (GdkWindow *win1,
 }
 
 void
-gdk_fb_window_send_crossing_events (GdkWindow *dest,
+gdk_fb_window_send_crossing_events (GdkWindow *src,
+                                   GdkWindow *dest,
                                    GdkCrossingMode mode)
 {
   GdkWindow *c;
@@ -555,9 +577,9 @@ gdk_fb_window_send_crossing_events (GdkWindow *dest,
   GdkModifierType my_mask;
   GList *path, *list;
   gboolean non_linear;
-  gboolean only_grabbed_window;
   GdkWindow *a;
   GdkWindow *b;
+  GdkWindow *event_win;
 
   if ((mode == GDK_CROSSING_NORMAL) &&
       (dest == gdk_fb_window_containing_pointer))
@@ -566,18 +588,12 @@ gdk_fb_window_send_crossing_events (GdkWindow *dest,
   if (gdk_fb_window_containing_pointer == NULL)
     gdk_fb_window_containing_pointer = gdk_window_ref (gdk_parent_root);
 
-  if (mode == GDK_CROSSING_UNGRAB)
-    a = _gdk_fb_pointer_grab_window;
+  if (src)
+    a = src;
   else
     a = gdk_fb_window_containing_pointer;
   b = dest;
 
-  /* When grab in progress only send normal crossing events about
-   * the grabbed window.
-   */
-  only_grabbed_window = (_gdk_fb_pointer_grab_window_events != NULL) &&
-                        (mode == GDK_CROSSING_NORMAL);
-  
   if (a==b)
     return;
 
@@ -587,12 +603,10 @@ gdk_fb_window_send_crossing_events (GdkWindow *dest,
 
   non_linear = (c != a) && (c != b);
 
-  if (!only_grabbed_window || (a == _gdk_fb_pointer_grab_window))
-    event = gdk_event_make (a, GDK_LEAVE_NOTIFY, TRUE);
-  else
-    event = NULL;
-  if (event)
+  event_win = gdk_fb_pointer_event_window (a, GDK_LEAVE_NOTIFY);
+  if (event_win)
     {
+      event = gdk_event_make (event_win, GDK_LEAVE_NOTIFY, TRUE);
       event->crossing.subwindow = NULL;
       gdk_window_get_root_origin (a, &x_int, &y_int);
       event->crossing.x = x - x_int;
@@ -617,12 +631,10 @@ gdk_fb_window_send_crossing_events (GdkWindow *dest,
       win = GDK_WINDOW (GDK_WINDOW_OBJECT (a)->parent);
       while (win != c)
        {
-         if (!only_grabbed_window || (win == _gdk_fb_pointer_grab_window))
-           event = gdk_event_make (win, GDK_LEAVE_NOTIFY, TRUE);
-         else
-           event = NULL;
-         if (event)
+         event_win = gdk_fb_pointer_event_window (win, GDK_LEAVE_NOTIFY);
+         if (event_win)
            {
+             event = gdk_event_make (event_win, GDK_LEAVE_NOTIFY, TRUE);
              event->crossing.subwindow = gdk_window_ref (last);
              gdk_window_get_root_origin (win, &x_int, &y_int);
              event->crossing.x = x - x_int;
@@ -663,12 +675,10 @@ gdk_fb_window_send_crossing_events (GdkWindow *dest,
          else 
            next = b;
          
-         if (!only_grabbed_window || (win == _gdk_fb_pointer_grab_window))
-           event = gdk_event_make (win, GDK_ENTER_NOTIFY, TRUE);
-         else
-           event = NULL;
-         if (event)
+         event_win = gdk_fb_pointer_event_window (win, GDK_ENTER_NOTIFY);
+         if (event_win)
            {
+             event = gdk_event_make (event_win, GDK_ENTER_NOTIFY, TRUE);
              event->crossing.subwindow = gdk_window_ref (next);
              gdk_window_get_root_origin (win, &x_int, &y_int);
              event->crossing.x = x - x_int;
@@ -687,12 +697,10 @@ gdk_fb_window_send_crossing_events (GdkWindow *dest,
       g_list_free (path);
     }
 
-  if (!only_grabbed_window || (b == _gdk_fb_pointer_grab_window))
-    event = gdk_event_make (b, GDK_ENTER_NOTIFY, TRUE);
-  else
-    event = NULL;
-  if (event)
+  event_win = gdk_fb_pointer_event_window (b, GDK_ENTER_NOTIFY);
+  if (event_win)
     {
+      event = gdk_event_make (event_win, GDK_ENTER_NOTIFY, TRUE);
       event->crossing.subwindow = NULL;
       gdk_window_get_root_origin (b, &x_int, &y_int);
       event->crossing.x = x - x_int;
@@ -710,13 +718,14 @@ gdk_fb_window_send_crossing_events (GdkWindow *dest,
       event->crossing.state = my_mask;
     }
 
-  if ((mode != GDK_CROSSING_GRAB) &&
-      (b != gdk_fb_window_containing_pointer) &&
-      !only_grabbed_window)
+  if (mode != GDK_CROSSING_GRAB)
     {
-      gdk_fb_send_focus_change (gdk_fb_window_containing_pointer, b);
-      gdk_window_unref (gdk_fb_window_containing_pointer);
-      gdk_fb_window_containing_pointer = gdk_window_ref (b);
+      gdk_fb_change_focus (b);
+      if (b != gdk_fb_window_containing_pointer)
+       {
+         gdk_window_unref (gdk_fb_window_containing_pointer);
+         gdk_fb_window_containing_pointer = gdk_window_ref (b);
+       }
     }
 }
 
@@ -744,7 +753,8 @@ gdk_window_show (GdkWindow *window)
          send_map_events (private, TRUE);
 
          mousewin = gdk_window_at_pointer (NULL, NULL);
-         gdk_fb_window_send_crossing_events (mousewin, 
+         gdk_fb_window_send_crossing_events (NULL,
+                                             mousewin, 
                                              GDK_CROSSING_NORMAL);
 
          if (private->input_only)
@@ -764,6 +774,7 @@ gdk_window_hide (GdkWindow *window)
 {
   GdkWindowObject *private;
   GdkWindow *mousewin;
+  GdkWindow *event_win;
   
   g_return_if_fail (window != NULL);
   
@@ -775,7 +786,9 @@ gdk_window_hide (GdkWindow *window)
       GdkRectangle r;
       gboolean do_hide;
 
-      event = gdk_event_make (window, GDK_UNMAP, TRUE);
+      event_win = gdk_fb_other_event_window (window, GDK_UNMAP);
+      if (event_win)
+       event = gdk_event_make (event_win, GDK_UNMAP, TRUE);
 
       r.x = GDK_DRAWABLE_IMPL_FBDATA (window)->llim_x;
       r.y = GDK_DRAWABLE_IMPL_FBDATA (window)->llim_y;
@@ -785,7 +798,8 @@ gdk_window_hide (GdkWindow *window)
       private->mapped = FALSE;
 
       mousewin = gdk_window_at_pointer (NULL, NULL);
-      gdk_fb_window_send_crossing_events (mousewin, 
+      gdk_fb_window_send_crossing_events (NULL,
+                                         mousewin, 
                                          GDK_CROSSING_NORMAL);
 
       do_hide = gdk_fb_cursor_need_hide (&r);
@@ -1113,9 +1127,11 @@ gdk_fb_window_move_resize (GdkWindow *window,
          /* Send GdkEventConfigure for toplevel windows */
          if (private->window_type != GDK_WINDOW_CHILD)
            {
-             event = gdk_event_make (window, GDK_CONFIGURE, TRUE);
-             if (event) 
+             GdkWindow *event_win;
+             event_win = gdk_fb_other_event_window (window, GDK_CONFIGURE);
+             if (event_win)
                {
+                 event = gdk_event_make (event_win, GDK_CONFIGURE, TRUE);
                  event->configure.x = private->x;
                  event->configure.y = private->y;
                  event->configure.width = GDK_DRAWABLE_IMPL_FBDATA (private)->width;
@@ -1125,7 +1141,8 @@ gdk_fb_window_move_resize (GdkWindow *window,
 
          /* The window the pointer is in might have changed */
          mousewin = gdk_window_at_pointer (NULL, NULL);
-         gdk_fb_window_send_crossing_events (mousewin, 
+         gdk_fb_window_send_crossing_events (NULL,
+                                             mousewin, 
                                              GDK_CROSSING_NORMAL);
        }
     }
@@ -1682,6 +1699,11 @@ gdk_window_set_events (GdkWindow       *window,
   
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
+
+  if (event_mask & GDK_BUTTON_MOTION_MASK)
+    event_mask |=
+      GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK |
+      GDK_BUTTON3_MOTION_MASK;
   
   if (!GDK_WINDOW_DESTROYED (window))
     GDK_WINDOW_IMPL_FBDATA (window)->event_mask = event_mask;
index e566b049702338a553f832d3c5d7d02d7d29d850..0abb2d9d632e90e5c311d17828f9c20a485a9532 100644 (file)
@@ -2657,13 +2657,23 @@ gtk_drag_update (GtkDragSourceInfo *info,
                       x_root, y_root, action, 
                       possible_actions,
                       time))
+    {
+      if (info->last_event != event) /* Paranoia, should not happen */
+       {
+         if (info->last_event)
+           gdk_event_free ((GdkEvent *)info->last_event);
+         info->last_event = gdk_event_copy ((GdkEvent *)event);
+       }
+    }
+  else
     {
       if (info->last_event)
-       gdk_event_free ((GdkEvent *)info->last_event);
-      
-      info->last_event = gdk_event_copy ((GdkEvent *)event);
+       {
+         gdk_event_free ((GdkEvent *)info->last_event);
+         info->last_event = NULL;
+       }
     }
-
+  
   if (dest_window)
     gdk_window_unref (dest_window);